package it.csi.finregio.finreges.junit.integration;

import java.util.Collection;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.math.RandomUtils;

import it.crp.exception.ServiceException;
import it.csi.finregio.finreges.dto.Classificazione;
import it.csi.finregio.finreges.dto.DestinatarioScheda;
import it.csi.finregio.finreges.dto.Direzione;
import it.csi.finregio.finreges.dto.Ente;
import it.csi.finregio.finreges.dto.EnteScheda;
import it.csi.finregio.finreges.dto.NotaScadenza;
import it.csi.finregio.finreges.dto.Riferimento;
import it.csi.finregio.finreges.dto.Scheda;
import it.csi.finregio.finreges.dto.Settore;
import it.csi.finregio.finreges.dto.SottoClassificazione;
import it.csi.finregio.finreges.dto.Stato;
import it.csi.finregio.finreges.dto.TipoRiferimento;
import junit.framework.TestCase;

public class SchedaServiceTest extends TestCase {

	public void testCreateScheda() throws Exception {
		Scheda s = new Scheda();
		s.setAnno("2009");
		s.setNoteClassificazione("nota della classificazione");
		s.setNoteTitolo("nota al titolo");
		s.setNumeroQuaderno("098");
		s.setProgressivo("1");

		SottoClassificazione sottoClass = new SottoClassificazione();
		sottoClass.setIdSottoClassificazione("7");
		Classificazione classificazione = new Classificazione();
		classificazione.setIdClassificazione("7");
		s.setClassificazione(classificazione);
		s.setSottoClassificazione(sottoClass);
		s.setTitolo("il titolo");
		new JUnitSchedaService().createScheda(s);
	}

	public void testCreateRiferimento() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		Scheda scheda = service.findSchedaByIdScheda("138");
		Riferimento riferimento = new Riferimento();
		riferimento.setScheda(scheda);
		riferimento.setAltroRiferimento("Altro riferimento");
		// riferimento.setComma("15");
		// riferimento.setCommaAggiuntivo("222");
		// riferimento.setData("10/07/2008");
		// riferimento.setLettera("A");
		riferimento.setNoteRiferimenti("Note riferimenti");
		// riferimento.setNumeroAtto("125");
		// riferimento.setNumeroArticolo("256");
		riferimento.setPubblicazione("pubblicazione");
		// TipoRiferimento tipoRiferimento = (TipoRiferimento) new
		// JUnitFinregioService()
		// .getListaTipoRiferimento().toArray()[0];
		// riferimento.setTipoRiferimento(tipoRiferimento);
		service.createRiferimento(riferimento);
	}

	public void testFindSchedaByIdScheda() throws Exception {
		String idScheda = "315";
		JUnitSchedaService service = new JUnitSchedaService();
		Scheda scheda = service.findSchedaByIdScheda(idScheda);
		System.out.println(scheda.getClassificazione());
		System.out.println(scheda.getSottoClassificazione());

	}

	public void testFindRiferimentoByIdScheda() throws Exception {
		String idScheda = "12";
		JUnitSchedaService service = new JUnitSchedaService();
		Riferimento[] riferimento = service.findRiferimentoByIdScheda(idScheda);
		for (int i = 0; i < riferimento.length; i++) {
			Riferimento r = riferimento[i];
			System.out.println(r);
		}

	}

	public void testFindNotaScadenzaByIdScheda() throws Exception {
		String idScheda = "12";
		JUnitSchedaService service = new JUnitSchedaService();
		NotaScadenza notaScadenza = service
				.findNotaScadenzaByIdScheda(idScheda);
		System.out.println(notaScadenza);

	}

	public void testCreateEnteScheda() throws Exception {
		String idScheda = "12";
		JUnitSchedaService service = new JUnitSchedaService();
		JUnitFinregioService finser = new JUnitFinregioService();
		Scheda scheda = service.findSchedaByIdScheda(idScheda);

		System.out.println(scheda);
		EnteScheda enteScheda = new EnteScheda();
		enteScheda.setScheda(scheda);
		enteScheda.setAltreInfo("altre info");
		Direzione direzione = (Direzione) finser.getListaDirezioni().toArray()[0];
		Settore settore = (Settore) finser.getListaSettori().toArray()[0];
		Ente ente = (Ente) finser.getListaEnti().toArray()[0];
		enteScheda.setDirezione(direzione);
		enteScheda.setEnte(ente);
		enteScheda.setEmail1("email@1");
		enteScheda.setEmail2("email@2");
		enteScheda.setEmail3("email@3");
		enteScheda.setNote("note");
		enteScheda.setSettore(settore);
		enteScheda.setWebsite1("site1");
		enteScheda.setWebsite2("site2");
		enteScheda.setWebsite3("site3");
		service.createEnteScheda(enteScheda);

	}

	public void testCreateNotaScadenza() throws Exception {
		String idScheda = "12";
		JUnitSchedaService service = new JUnitSchedaService();
		JUnitFinregioService finser = new JUnitFinregioService();
		Scheda scheda = service.findSchedaByIdScheda(idScheda);

		System.out.println(scheda);
		NotaScadenza notaScadenza = new NotaScadenza();
		notaScadenza.setScheda(scheda);
		notaScadenza.setNotaInterna("NotaInterna");
		notaScadenza.setDataScadenza("10/07/2008");
		notaScadenza.setTermineScadenza("Termine della scadenza");
		service.createNotaScadenza(notaScadenza);

	}

	public void testCreateDestinatarioScheda() throws Exception {
		String idScheda = "285";
		JUnitSchedaService service = new JUnitSchedaService();
		JUnitFinregioService finser = new JUnitFinregioService();
		Scheda scheda = service.findSchedaByIdScheda(idScheda);

		System.out.println(scheda);
		DestinatarioScheda destinatarioScheda = new DestinatarioScheda();

		destinatarioScheda.setDestinatari("destinatari sono qui qui qui");
		// destinatarioScheda.setDestinatariPlain("destinatari plai");
		destinatarioScheda.setFinanziamenti("finanziamenti");
		// destinatarioScheda.setFinanziamentiPlain("finanziamentiPlain");
		destinatarioScheda.setNoteDestinatari("noteDestinatari");
		destinatarioScheda.setNoteFinanziamenti("noteFinanziamenti");
		destinatarioScheda.setNoteProcedura("noteProcedura");
		destinatarioScheda.setProcedura("procedura");
		// destinatarioScheda.setProceduraPlain("proceduraPlain");
		destinatarioScheda.setScheda(scheda);
		service.createDestinatarioScheda(destinatarioScheda);
	}

	public void testAggiornaScheda() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		Scheda scheda = service.findSchedaByIdScheda("315");

		scheda.setNoteClassificazione(RandomStringUtils.randomAlphabetic(15));
		// Collection sottoClassificazioni = new JUnitFinregioService()
		// .getListaSottoclassificazioni();
		// int random = RandomUtils.nextInt(sottoClassificazioni.size());
		// if (random > sottoClassificazioni.size()) {
		// random = sottoClassificazioni.size() - 1;
		// }
		// scheda
		// .setSottoClassificazione((SottoClassificazione) sottoClassificazioni
		// .toArray()[random]);
		// System.out.println(random);
		SottoClassificazione sc = new SottoClassificazione();
		sc.setIdSottoClassificazione("14");
		Classificazione cl = new Classificazione();
		cl.setIdClassificazione("21");
		scheda.setSottoClassificazione(sc);
		scheda.setClassificazione(cl);
		service.aggiornaScheda(scheda);
	}

	public void testAggiornaRiferimento() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		Riferimento[] riferimenti = service.findRiferimentoByIdScheda("12");
		for (int i = 0; i < riferimenti.length; i++) {
			Riferimento rif = riferimenti[i];
			rif.setNoteRiferimenti(RandomStringUtils.randomAlphabetic(15));
			Collection listaTipoRif = new JUnitFinregioService()
					.getListaTipoRiferimento();
			int random = RandomUtils.nextInt(listaTipoRif.size());
			if (random > listaTipoRif.size()) {
				random = listaTipoRif.size() - 1;
			}
			rif
					.setTipoRiferimento((TipoRiferimento) listaTipoRif
							.toArray()[random]);
			System.out.println(random);
			service.aggiornaRiferimento(rif);
		}
	}

	public void testAggiornaEnteScheda() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		EnteScheda[] enteSchedas = service.findEnteSchedaByIdScheda("12");

		for (int i = 0; i < enteSchedas.length; i++) {
			EnteScheda es = enteSchedas[i];
			System.out.println(es);

			es.setNote(RandomStringUtils.randomAlphabetic(15));
			Collection listaSettori = new JUnitFinregioService()
					.getListaSettori();
			int random = RandomUtils.nextInt(listaSettori.size());
			if (random > listaSettori.size()) {
				random = listaSettori.size() - 1;
			}
			es.setSettore((Settore) listaSettori.toArray()[random]);
			System.out.println(random);
			service.aggiornaEntiSchede(es);
		}
	}

	public void testAggiornaNotaScadenza() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		NotaScadenza notaScadenza = service.findNotaScadenzaByIdScheda("12");

		System.out.println(notaScadenza);

		notaScadenza.setDataScadenza("15/07/2008");

		notaScadenza.setNotaInterna("Cambio della nota interna");
		service.aggiornaNoteScadenza(notaScadenza);
	}

	public void testAggiornaDestinatarioScheda() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		DestinatarioScheda es = service.findDestinatarioByIdScheda("298");

		System.out.println(es);

		// es.setNote(RandomStringUtils.randomAlphabetic(15));
		es.setDestinatariPlain("a");
		es.setFinanziamentiPlain("1");
		es.setProcedura("xxxxxxxxxxxxxxxxxxxxxxx");
		es.setNoteDestinatari("change note destinatari");
		service.aggiornaDestinatariSchede(es);
	}

	public void testCreaBozza() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		service.creaBozza("2010", "100");
	}

	public void testDeleteScheda() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		Scheda scheda = service.findSchedaByIdScheda("93");
		boolean ris = service.deleteScheda(scheda);
		System.out.println("Risultato -- scheda " + (ris ? "" : "non ")
				+ "cancellata");
	}

	public void testChangeStatoScheda() throws Exception {
		JUnitSchedaService service = new JUnitSchedaService();
		Scheda scheda = service.findSchedaByIdScheda("12");
		Stato stato = new Stato();
		stato.setIdStato(Integer.toString(Stato.PUBBLICATA));
		scheda.setStato(stato);
		service.changeStatoScheda(scheda);
	}

	public void testFindSchedeByStato() throws ServiceException {
		JUnitSchedaService service = new JUnitSchedaService();
		Stato stato = new Stato();
		stato.setIdStato(Integer.toString(Stato.PUBBLICATA));
		Collection schdeByStato = service.findSchedeByStato(stato);
		System.out.println(schdeByStato);
	}

	public void testFindNextProgressivo() throws ServiceException {
		JUnitSchedaService service = new JUnitSchedaService();
		System.out.println(service.findNextProgressivoScheda("2010", "98"));
	}

	public void testRinumeraSchede() throws Exception {
		new JUnitSchedaService().rinumeraSchede("2009", "98");

	}

	public void testLoadAnnoNumQuadernoAttuale() throws ServiceException {
		Scheda scheda = new JUnitSchedaService().loadAnnoNumQuadernoAttuale();
		System.out.println(scheda);

	}
}
